package com.atguigu.juc.chap10;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CompletableFutureDemo03 {

    public static void main(String[] args) {

        // 1、创建线程池对象
        ExecutorService threadPool = Executors.newFixedThreadPool(5);

        // 2、链式调用执行多个任务
        CompletableFuture.runAsync(() -> {
            System.out.println(Thread.currentThread().getName() + " 1 is working");
        }, threadPool).thenRun(() -> {
            // 封装后续处理任务
            System.out.println(Thread.currentThread().getName() + " 2 is behind");
        });

        // thenRunAsync：强制使用默认的线程池对象
        // thenRun：使用空余线程（可能会是主线程）

        // CompletableFuture的默认线程池在main方法结束时即被回收，在这个线程池中的任务立即停止
        // 如果想让默认的线程池的任务正常结束，那么有几种集中解决方式：
        // 1.让主线程延迟结束，例如结束时休眠一会儿
        // 2.在测试用例中使用
        // 3.在web中使用
        // 4.自己传递线程池对象
        // 自定义的线程池不受main函数的影响，会执行完所以任务之后结束

        System.out.println(Thread.currentThread().getName() + " 3 is behind");

        // 3、关闭线程池
        threadPool.shutdown();
    }
}